#ifndef GPU_RENDER_TBR_HPP
#define GPU_RENDER_TBR_HPP

#include "ap_int.h"
#include "hls_stream.h"

// 包含所有子模块的头文件
#include "fpal.hpp"
#include "pbirsm.hpp"      // From DDR to Triangle Binning input
#include "hr_tbr.hpp"      // Triangle Binning module (new name for HR)
#include "tbr_rasterizer.hpp" // Tile-Based Rasterizer module (new)

// 辅助函数：将常量参数推送到 stream (用于 num_triangles, max_x, max_y)
void stream_constants(
    const ap_uint<16> num_triangles,
    const fpal::fp_screen_pixel_idx_t max_x,
    const fpal::fp_screen_pixel_idx_t max_y,
    hls::stream<ap_uint<16>>& s_num_triangles,
    hls::stream<fpal::fp_screen_pixel_idx_t>& s_max_x,
    hls::stream<fpal::fp_screen_pixel_idx_t>& s_max_y
);

// 顶层 GPU_Render_TBR HLS 函数声明
void GPU_Render_TBR(
    // --- 控制参数 (来自 PS, 写入 S_AXILITE 寄存器) ---
    // PBIRSM 的参数
    ddr_word_t* params_buffer_base_addr,       // DDR中三角形参数缓冲区的基地址
    const ap_uint<16> num_triangles_to_process, // 需要处理的三角形数量

    const fpal::fp_screen_pixel_idx_t max_x_res,
    const fpal::fp_screen_pixel_idx_t max_y_res,

    // TBR_Rasterizer 的 DDR 接口 (通过流传递其基地址)
    // 直接传入 AXI 端口指针本身，而不是通过 s_axilite 传入基地址
    zbuffer_ddr_word_t* zbuffer_ddr_raw_ptr, // 深度缓冲区原始指针
    color_ddr_word_t* framebuffer_ddr_raw_ptr,  // 帧缓冲区原始指针

    // --- 状态输出 (给 PS, 从 S_AXILITE 寄存器读取) ---
    ap_uint<32>& total_write_ops_processed     // TBR_Rasterizer 实际写入DDR的有效像素数 (通过深度测试)
);

#endif // GPU_RENDER_TBR_HPP
